﻿namespace D.Wx.AppsettingsUtil
{
    /// <summary>
    /// 配置文件操作
    /// </summary>
    public static class ConfigUtil
    {
        /// <summary>
        /// 排除运行时 Json 后缀
        /// </summary>
        private static readonly string[] runtimeJsonSuffixs = new[]
        {
            "deps.json",
            "runtimeconfig.dev.json",
            "runtimeconfig.prod.json",
            "runtimeconfig.json"
        };


        /// <summary>
        /// 自动加载自定义 .json 配置文件
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="env"></param>
        public static void AddConfigureFiles(this IConfiguration configuration, IHostEnvironment env)
        {
            var config = new ConfigurationBuilder();

            // 获取bin目录下的配置文件
            var jsonFiles = Directory.GetFiles(AppContext.BaseDirectory, "*.json", SearchOption.TopDirectoryOnly);

            // 当前项目根目录下的配置文件
            //.Union(
            //    Directory.GetFiles(Directory.GetCurrentDirectory(), "*.json", SearchOption.TopDirectoryOnly)
            //);

            // 如果没有配置文件，中止执行
            if (!jsonFiles.Any()) return;

            // 获取环境变量名
            var envName = env.EnvironmentName;

            // 获取所有文件名
            var fileNames = jsonFiles.Select(m => Path.GetFileName(m).Split('.', StringSplitOptions.RemoveEmptyEntries))// 从文件名称分割成数组
                                     .Where(m => m.Contains(envName))// 获取包含当前环境的配置
                                     .Select(m => string.Join('.', m))// 拼接成文件名称
                                     .Distinct() // 文件名称去重
                                     .Where(m => !runtimeJsonSuffixs.Contains(m, StringComparer.OrdinalIgnoreCase)) // 文件过滤
                                     .ToList();

            // 将所有文件进行过滤
            var jsonFilesGroups = jsonFiles.Where(m => fileNames.Contains(Path.GetFileName(m))).ToList();

            // 遍历所有配置分组
            foreach (var firstJsonFile in jsonFilesGroups)
            {
                // 默认加载第一个
                //config.AddIniFile(firstJsonFile, optional: true, reloadOnChange: true); // reloadOnChange 自动更新
                config.AddJsonFile(firstJsonFile, optional: true, reloadOnChange: true); // reloadOnChange 自动更新
            }

            //// 存储配置
            AppsettingsUtils.Configuration = config.Build();
        }
    }
}
